// * this 的值仅在函数直接被通过点符号 obj.method() 或方括号 obj['method']() 语法（此处它们作用相同）调用时才被正确传递。
// * 还有很多种解决这个问题的方式，例如 func.bind()。

let user = {
	name: 'John',
	showName: function () {
		console.log(this.name)
	},
}

// * 为了确保通过 user.showName 调用函数时，this 指向 user，JS 玩了个小把戏 —— 点 "." 返回的不是一个函数，而是一个特殊的 Reference Type 的值。
user.showName() // John

// * Reference Type 是 ECMA 中的一个“规范类型”。我们不能直接使用它，但它被用在 JavaScript 语言内部。

// * Reference Type 的值是一个三个值的组合 (base, name, strict)，其中：
// * base 是对象。
// * name 是属性名。
// * strict 在 use strict 模式下为 true。

// * 对属性 user.showName 的访问，返回的不是一个函数，而是一个 Reference Type 的值。对于 user.showName 严格模式下是：
// * Reference Type 的值：(user, 'showName', true)
// * 当 () 被在 Reference Type 上调用时，它们会接收到关于对象和对象的方法的完整信息，然后可以设置正确的 this（在此处 =user）。
// * Reference Type 是一个特殊的“中间人”内部类型，目的是从 . 传递信息给 () 调用。
// * 任何例如赋值 hi = user.hi 等其他的操作，都会将 Reference Type 作为一个整体丢弃掉，而会取 user.hi（一个函数）的值并继续传递。所以任何后续操作都“丢失”了 this。
// * 因此，this 的值仅在函数直接被通过点符号 obj.method() 或方括号 obj['method']() 语法（此处它们作用相同）调用时才被正确传递。
